package de.fhffm.gärtnerei.gui;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.regex.Pattern;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import de.fhffm.gärtnerei.exceptions.InputException;
import de.fhffm.gärtnerei.tabellen.Art;
import de.fhffm.gärtnerei.tabellen.Pflanze;

public class PflanzeBearbeitenFenster implements ActionListener {

	private JButton btnSpeichern = new JButton("Speichern");
	private JButton btnAbbrechen = new JButton("Abbrechen");
	
	private JLabel labelSorte = new JLabel("Sorte");
	private JLabel labelArt = new JLabel("Art");
	private JLabel labelHerkunft = new JLabel("Herkunft");
	private JLabel labelFarbe = new JLabel("Farbe");
	private JLabel labelReifezeit = new JLabel("Reifezeit");
	private JLabel labelSchaerfegrad = new JLabel("Schaerfegrad");
	private JLabel labelErtrag = new JLabel("Ertrag");
	
	private JTextField txtSorte = new JTextField(8);
	private JTextField txtHerkunft = new JTextField(8);
	private JTextField txtFarbe = new JTextField(8);
	private JTextField txtReifezeit = new JTextField(8);
	private JTextField txtErtrag = new JTextField(8);
	
	private JFrame pflanzeBearbeitenFrame = new JFrame();
	
	private JPanel eingabePanel = new JPanel(new GridLayout(7,2));
	private JPanel buttonPanel = new JPanel();
	
	private String[] arten = { "C.annum","C.baccatum","C.chinese","C.frutescens","C.pubescens"};
	private String[] schaerfe = {"1","2","3","4","5","6","7","8","9","10"};
	private String art = null;
	private String farbe = null;
	private String herkunft = null;
	private String sorte = null;
	private String ertragString = null;

	private int schaerfegrad = 0;
	private int reifezeit = 0;
	private int ertrag = 0;
	
	StringBuilder sb = new StringBuilder();
	
	private List<String> ausgewaehlteZeile;
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private JComboBox artListe = new JComboBox(arten);
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private JComboBox schaerfeListe = new JComboBox(schaerfe);



	public PflanzeBearbeitenFenster(List<String> ausgewaehlteZeile){
		
		this.ausgewaehlteZeile = ausgewaehlteZeile;
		pflanzeBearbeitenFrame.setTitle("Pflanze Bearbeiten");	
		pflanzeBearbeitenFrame.setSize(400,500);
		pflanzeBearbeitenFrame.setLocationRelativeTo(null);
		pflanzeBearbeitenFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		pflanzeBearbeitenFrame.setVisible(true);
		pflanzeBearbeitenFrame.setResizable(true);
		pflanzeBearbeitenFrame.setLayout(new BorderLayout());
		
		eingabePanel.add(labelSorte);
		eingabePanel.add(txtSorte);
		eingabePanel.add(labelArt);
		eingabePanel.add(artListe);
		eingabePanel.add(labelHerkunft);
		eingabePanel.add(txtHerkunft);
		txtHerkunft.setToolTipText("Das Land aus der die Pflanze kommt");
		eingabePanel.add(labelFarbe);
		eingabePanel.add(txtFarbe);
		eingabePanel.add(labelReifezeit);
		eingabePanel.add(txtReifezeit);
		txtReifezeit.setToolTipText("Eine für die Sorte übliche Reifezeit in Tagen");
		eingabePanel.add(labelSchaerfegrad);
		eingabePanel.add(schaerfeListe);
		eingabePanel.add(labelErtrag);
		eingabePanel.add(txtErtrag);
		txtErtrag.setToolTipText("Ein für die Sorte üblicher Ertrag in gramm");
		
		buttonPanel.add(btnSpeichern);
		buttonPanel.add(btnAbbrechen);
		
		btnSpeichern.addActionListener(this);
		btnAbbrechen.addActionListener(this);
		
		pflanzeBearbeitenFrame.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
		pflanzeBearbeitenFrame.getContentPane().add(eingabePanel,BorderLayout.CENTER);
		
		
		fuelleTextfelder();
	}
	
	private void fuelleTextfelder() {
		
		txtSorte.setText(ausgewaehlteZeile.get(0));
		artListe.setSelectedItem(ausgewaehlteZeile.get(1));
		txtHerkunft.setText(ausgewaehlteZeile.get(2));
		txtFarbe.setText(ausgewaehlteZeile.get(3));
		txtReifezeit.setText(ausgewaehlteZeile.get(4));
		schaerfeListe.setSelectedItem((ausgewaehlteZeile.get(5)));
		String[] teilString = ausgewaehlteZeile.get(6).split(Pattern.quote(" ")); // gramm wird rausgeschnitten
		txtErtrag.setText(teilString[0]);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();

		if (obj == btnAbbrechen) {	
			pflanzeBearbeitenFrame.dispose();
			new BearbeitenTabellenFenster(1);
		}
		
		if(obj == btnSpeichern){
			
			if(ueberpruefeEingabe()){
				
				if(pflanzeNichtVorhanden()){ 
					ueberpruefeArt();
					speicherAenderungen();
					speichernEnde();
					
				}else{
					System.out.println("Pflanze schon vorhanden!");
				}
			
			} else{
				
				System.out.println("Eingabe Fehler");
			}
		}
	}
	
	private void speichernEnde() {
		Object[] options = {"Fertig!","Weiter bearbeiten"};
		int selected = JOptionPane.showOptionDialog(null,"Pflanze erfolgreich bearbeitet!", "Änderungen gespeichert", JOptionPane.YES_NO_OPTION,
					   JOptionPane.QUESTION_MESSAGE, null , options, options[1]);
		
		switch(selected){
		case 0:
			pflanzeBearbeitenFrame.dispose();
			break;
		case 1:
			pflanzeBearbeitenFrame.dispose();
			new BearbeitenTabellenFenster(1);
		}
	}
	
	private void ueberpruefeArt() {
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
	    Query q = em
	            .createQuery("SELECT p FROM Art p WHERE  p.art = :name");
	        q.setParameter("name",art);
	        
	        
	   if(q.getResultList().size() == 0){
		   // Wenn Art noch nicht vorhanden (weil evtl noch keine Pflanze dieser Art erstellt)
		   // muss die Art erstmal eingefügt werden um Fehler in der Methode speicherAenderungen() vorzubeugen
		   System.out.println("Art noch nicht vorhanden!");
		   
		   Art artTab = new Art();
		   artTab.setArt(art);
		   em.persist(artTab);
		   em.getTransaction().commit();
		   em.close();
	   }else{
		   System.out.println("Art schon vorhanden!");
		   em.close();
	   }
	}

	private void speicherAenderungen() {
		String originalSorte = ausgewaehlteZeile.get(0);
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();

		Query q = em.createQuery("UPDATE Pflanze p SET p.sorte = :sorte , p.herkunft =:herkunft , p.schaerfegrad =:schaerfegrad , p.farbe =:farbe , p.reifezeit =:reifezeit , p.ertrag =:ertrag WHERE p.sorte =:orgSorte");
					q.setParameter("sorte", sorte);
					q.setParameter("herkunft", herkunft);
					q.setParameter("schaerfegrad", schaerfegrad);
					q.setParameter("farbe",farbe);
					q.setParameter("reifezeit",reifezeit);
					q.setParameter("ertrag", ertragString);
					q.setParameter("orgSorte", originalSorte);
					q.executeUpdate();
		
		/*
		 * Hohle die Art und speicher sie in einer Liste
		 */
			
		q = em.createQuery("SELECT a FROM Art a WHERE a.art =:name");
			q.setParameter("name",art);
			
			Art artResult = (Art) q.getSingleResult();
			
		/*
		 *  Hohle die ungeänderte Pflanze und weise ihr die neue Art(falls geändert) zu
		 *  
		 */
			
		q = em.createQuery("SELECT p FROM Pflanze p WHERE p.sorte =:orgSorte");
			q.setParameter("orgSorte", originalSorte);
		Pflanze pflanze = (Pflanze) q.getSingleResult();
		pflanze.setArt(artResult);

		em.getTransaction().commit();
		em.close(); 
					
	}
	
	private boolean ueberpruefeEingabe() {
		
		boolean pruefe = false;
		try {
			pruefe = hohleEingabe();
		} catch (InputException e) {
			System.out.println("Eingabe Fehlt");
		} catch (NumberFormatException n){
			System.out.println("Bitte Zahlen eingeben!");
			JOptionPane.showMessageDialog(null,"Bitte für Ertrag,Schärfegrad und Reifezeit nur Zahlen eingeben.","Fehler",JOptionPane.ERROR_MESSAGE);
		}
		return pruefe;
		
	}
	
	private boolean hohleEingabe() throws InputException,NumberFormatException {

		art = (String) artListe.getSelectedItem();
		farbe = txtFarbe.getText();
		herkunft = txtHerkunft.getText();
		sorte = txtSorte.getText();
		schaerfegrad = Integer.parseInt((String) schaerfeListe.getSelectedItem());
		reifezeit = Integer.parseInt(txtReifezeit.getText());
		ertrag = Integer.parseInt(txtErtrag.getText());
		sb.append(ertrag).append(" gramm");
		ertragString = sb.toString();
		sb.setLength(0);
		
		if(isEingabeLeer()){
			
			throw new InputException("Eine oder mehrere Eingaben fehlen, bitte keine negativen Zahlen eingeben!");
			
		}else{

			return true;
		}
	}
	
	private boolean isEingabeLeer() {
		
		if(farbe.length() == 0 || herkunft.length() == 0 || sorte.length() == 0 || schaerfegrad <= 0 || reifezeit <= 0 || ertrag <= 0){
			
			return true;
			
		}else{
			
			return false;
			
		}
	}
	
	public boolean pflanzeNichtVorhanden() {
		
		boolean isVorhanden = false;
		try {
			isVorhanden = ueberpruefePflanze();
			
		} catch (InputException e) {
			System.out.println("Pflanze schon vorhanden Exception!");
		}

		return isVorhanden;			  
	}

	public boolean ueberpruefePflanze() throws InputException{

		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
	
		Query q = em.createQuery("SELECT p FROM Pflanze p WHERE  p.sorte = :name");
	 			  q.setParameter("name", sorte);
	 	
	 	//Wenn liste leer ist, gibt es die eingegebene Sorte noch nicht. 			  
	 	if(q.getResultList().size() == 0){
	 		em.close();   
	 		System.out.println("Pflanzen Sorte noch nicht vorhanden.");
	 		return true;
	 		
	 	}else{
	 		//Ansonst hohle die eingegebene Sorte
	 		Pflanze pflanze = (Pflanze) q.getSingleResult();
	 		pflanze.getSorte();	
	 	
	 		//Und überprüfe ob die Sorte aus der Tabelle überhaubt geändert wurde
	 		if((pflanze.getSorte()).equals(ausgewaehlteZeile.get(0))){
			// falls nicht tuhe nichts
	 			System.out.println("Gleiche Pflanze, keine Aktion erforderlich");
	 			return true;
		 	
	 		}else{
	 			// falls es nicht die gleiche Sorte aus der Tabelle ist, aber schon eine vorhandene ist
	 			// werfe Exception
	 			em.close();
	 			throw new InputException("Pflanzen Sorte schon vorhanden.");	 	   
	 		}
	 	}
	}
}




